package chapter02;

import java.util.ArrayList;
import java.util.List;

public class FullJustify68 {
    /**
     * 模拟情况
     * index=0 lineWidth=0 wordsWidth=0
     * 从string[0]单词开始 lineWidth记录当前字符数 wordsWidth记录当前已统计单词的字符数
     * 1.找到当前行无法再装下单词的下标j
     *  j<words.length&&lineWidth+words[j].length()+1<=maxWidth
     *  统计lineWidth和wordsWidth
     * 2.如果当前行只有一个单词 index==j-1
     *   前面补充单词 后面全部补空格
     * 3.当前行有多个单词
     *   a).如果当前行是最后一行 !j<words.length
     *      一个单词接一个空格 没有单词的话后面全部补空格
     *   b).不是最后一行 j<words.length
     *      average=(maxWidth-wordsWidth)/(j-index-1) 两个单词间的最少空格数
     *      dis=maxWidth-wordsWidth-average*(j-index-1) 还可能需要补全的空格数
     *      输出第一个单词
     *      while
     *          如果dis>0 输出一个空格 dis--
     *          再输出average个空格
     *          输出后续单词
     * index=j 改变index
     */
    public List<String> fullJustify(String[] words, int maxWidth) {
        List<String> list=new ArrayList<>();
        int index=0;
        int lineWidth=0;
        int wordsWidth=0;
        while (index<words.length){
            lineWidth=wordsWidth=0;
            StringBuffer path=new StringBuffer();
            lineWidth+=words[index].length();
            wordsWidth+=words[index].length();
            int j=index+1;
            while (j<words.length&&lineWidth+words[j].length()+1<=maxWidth){
                wordsWidth+=words[j].length();
                lineWidth+=words[j++].length()+1;
            }
            if(index==j-1){
                path.append(words[index]);
                for(int i=1;i<=maxWidth-words[index].length();i++){
                    path.append(' ');
                }
            }else{
                if(j<words.length){
                    int average=(maxWidth-wordsWidth)/(j-index-1);
                    int dis=maxWidth-wordsWidth-average*(j-index-1);
                    path.append(words[index]);
                    for(int i=index+1;i<j;i++){
                        if(dis>0){
                            path.append(' ');
                            dis--;
                        }
                        for(int t=1;t<=average;t++){
                            path.append(' ');
                        }
                        path.append(words[i]);
                    }
                }else{
                    lineWidth=0;
                    path.append(words[index]);
                    lineWidth+=words[index].length();
                    for(int i=index+1;i<j;i++){
                        path.append(' ');
                        path.append(words[i]);
                        lineWidth+=1+words[i].length();
                    }
                    for(int i=1;i<=maxWidth-lineWidth;i++){
                        path.append(' ');
                    }
                }
            }
            list.add(path.toString());
            index=j;
        }
        return list;
    }
}
